import gmsh
import numpy as np
import os

# 切换工作目录到当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(current_dir)

# 初始化Gmsh API
gmsh.initialize()
gmsh.option.setNumber("General.Terminal", 1)  # 启用终端输出

# 创建新模型（命名为"disk"）
gmsh.model.add("disk")

# 设置参数：边缘点数和圆盘半径
n_points = 16  # 边缘点数（控制剖分三角形数量）
radius = 1.0   # 单位圆盘半径

gmsh.option.setNumber("Mesh.CharacteristicLengthFactor", 2)  # float参数 设置缩放比例 大于1放大 小于1缩小

# 创建中心点（索引为center）
center = gmsh.model.geo.addPoint(0, 0, 0)

# 创建边缘点（16个均匀分布的点）
points = []
for i in range(n_points):
    angle = 2 * np.pi * i / n_points  # 计算角度（0到2π）
    x = radius * np.cos(angle)        # 计算x坐标
    y = radius * np.sin(angle)        # 计算y坐标
    p = gmsh.model.geo.addPoint(x, y, 0)  # 添加点
    points.append(p)  # 存储点的索引

# 创建边缘曲线（线段）
curves = []
for i in range(n_points):
    p1 = points[i]                  # 当前点
    p2 = points[(i+1) % n_points]   # 下一个点（循环连接）
    c = gmsh.model.geo.addLine(p1, p2)  # 添加线段
    curves.append(c)  # 存储曲线索引

# 创建曲线环（闭合曲线）
cl = gmsh.model.geo.addCurveLoop(curves)

# 基于曲线环创建平面区域
s = gmsh.model.geo.addPlaneSurface([cl])

# 更新几何模型（同步所有几何操作）
gmsh.model.geo.synchronize()

# 设置物理组（标记区域）
gmsh.model.addPhysicalGroup(2, [s], 1)  # 2D区域，ID为1
gmsh.model.setPhysicalName(2, 1, "Solid")  # 命名为"Solid"

# 设置网格算法：6 = Delaunay三角形剖分
gmsh.option.setNumber("Mesh.Algorithm", 6)

# 生成2D网格（三角形）
gmsh.model.mesh.generate(2)

# 保存网格到文件
gmsh.write("disk_solid.msh")

# 获取并打印网格信息
element_types, element_tags, node_tags = gmsh.model.mesh.getElements(2)
print(f"生成的三角形数量: {len(element_tags[0])}")

# 关闭Gmsh API
gmsh.finalize()
